/**
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trim.gui.testing.components;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.basic.BasicButtonUI;


/**
 *
 * @author Дмитрий
 */
public class CloseTabsTabbedPane extends JTabbedPane
{

  public CloseTabsTabbedPane(int tabPlacement,int tabLayoutPolicy)
  {
    super(tabPlacement,tabLayoutPolicy);
  }

  public CloseTabsTabbedPane(int tabPlacement)
  {
    super(tabPlacement);
  }

  public CloseTabsTabbedPane()
  {
  }

  @Override
  public void addTab(String title,Component component)
  {
    super.addTab(title,component);
    int index=this.getTabCount()-1;
    this.setTabComponentAt(index,new TabButtonComponent(this));
  }

  @Override
  public void addTab(String title,Icon icon,Component component)
  {
    super.addTab(title,icon,component);
    int index=this.getTabCount()-1;
    this.setTabComponentAt(index,new TabButtonComponent(this));
  }

  @Override
  public void addTab(String title,Icon icon,Component component,String tip)
  {
    super.addTab(title,icon,component,tip);
    int index=this.getTabCount()-1;
    this.setTabComponentAt(index,new TabButtonComponent(this));
  }

}
class TabButtonComponent extends JPanel
{

  private final JTabbedPane pane;

  public TabButtonComponent(final JTabbedPane pane)
  {
    //unset default FlowLayout' gaps
    super(new FlowLayout(FlowLayout.LEFT,0,0));
    if(pane==null)
    {
      throw new NullPointerException("TabbedPane is null");
    }
    this.pane=pane;
    setOpaque(false);

    //make JLabel read titles from JTabbedPane
    JLabel label=new JLabel()
    {

      @Override
      public String getText()
      {
        int i=pane.indexOfTabComponent(TabButtonComponent.this);
        if(i!=-1)
        {
          return pane.getTitleAt(i);
        }
        return null;
      }
    };

    add(label);
    //add more space between the label and the button
    label.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));
    //tab button
    JButton button=new TabButton();
    add(button);
    //add more space to the top of the component
    setBorder(BorderFactory.createEmptyBorder(2,0,0,0));
  }

  private class TabButton extends JButton implements ActionListener
  {

    public TabButton()
    {
      int size=17;
      setPreferredSize(new Dimension(size,size));
      setToolTipText("close this tab");
      //Make the button looks the same for all Laf's
      setUI(new BasicButtonUI());
      //Make it transparent
      setContentAreaFilled(false);
      //No need to be focusable
      setFocusable(false);
      setBorder(BorderFactory.createEtchedBorder());
      setBorderPainted(false);
      //Making nice rollover effect
      //we use the same listener for all buttons
      addMouseListener(buttonMouseListener);
      setRolloverEnabled(true);
      //Close the proper tab by clicking the button
      addActionListener(this);
    }

    public void actionPerformed(ActionEvent e)
    {
      int i=pane.indexOfTabComponent(TabButtonComponent.this);
      if(i!=-1)
      {
        pane.remove(i);
      }
    }

    //we don't want to update UI for this button
    @Override
    public void updateUI()
    {
    }

    //paint the cross
    @Override
    protected void paintComponent(Graphics g)
    {
      super.paintComponent(g);
      Graphics2D g2=(Graphics2D)g.create();
      //shift the image for pressed buttons
      if(getModel().isPressed())
      {
        g2.translate(1,1);
      }
      g2.setStroke(new BasicStroke(2));
      g2.setColor(Color.BLACK);
      if(getModel().isRollover())
      {
        g2.setColor(Color.MAGENTA);
      }
      int delta=6;
      g2.drawLine(delta,delta,getWidth()-delta-1,getHeight()-delta-1);
      g2.drawLine(delta,getHeight()-delta-1,getWidth()-delta-1,delta);
      g2.dispose();
    }
  }

  private final static MouseListener buttonMouseListener=new MouseAdapter()
  {

    @Override
    public void mouseEntered(MouseEvent e)
    {
      Component component=e.getComponent();
      if(component instanceof AbstractButton)
      {
        AbstractButton button=(AbstractButton)component;
        button.setBorderPainted(true);
      }
    }

    @Override
    public void mouseExited(MouseEvent e)
    {
      Component component=e.getComponent();
      if(component instanceof AbstractButton)
      {
        AbstractButton button=(AbstractButton)component;
        button.setBorderPainted(false);
      }
    }
  };
}


